package com.lancoo.edu.platform.operation.commons.utils;

import com.lancoo.edu.platform.operation.commons.enums.FileEnum;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.List;

/**
 * 文件工具类
 *
 * @author pky
 */
public class FileUtil extends cn.hutool.core.io.FileUtil {

    private static final Logger logger = LoggerFactory.getLogger(FileUtil.class);

    /**
     * 图片类型
     */
    private static final String IMAGES_TYPE   = ".jpg|.jpeg|.png|.bmp|.emf|.JPG|.JPEG|.PNG|.BMP|.EMF";
    /**
     * 音频类型
     */
    private static final String VOICE_TYPE    = ".cd|.wav|.mp3|.midi|.ogg|.CD|.WAV|.MP3|.MIDI|.OGG";
    /**
     * 视频类型
     */
    private static final String VIDEO_TYPE    = ".avi|.rmvb|.rm|.asf|.div|.mpg|.mpeg|.mpe|.wmv|.mp4|.mkv|.vob|.3gp";
    /**
     * 文件类型
     */
    private static final String DOCUMENT_TYPE = ".doc|.docx|.txt|.pdf|.ppt|.xls|.xlsx";


    /**
     * 获取文件类型
     *
     * @param fileName 文件名
     * @return 文件类型
     */
    public static String getFileType(String fileName) {
        if (StringUtil.isBlank(fileName)) {
            return "";
        }
        return fileName.substring(fileName.lastIndexOf("."));
    }

    /**
     * 获取文件归类
     *
     * @param filename 文件名称
     * @return 文件归类，如image、video、document、voice、other
     */
    public static String getFileClassify(String filename) {
        String fileType = getFileType(filename);
        if (IMAGES_TYPE.contains(fileType)) {
            return "image";
        }
        if (VOICE_TYPE.contains(fileType)) {
            return "voice";
        }
        if (VIDEO_TYPE.contains(fileType)) {
            return "video";
        }
        if (DOCUMENT_TYPE.contains(fileType)) {
            return "document";
        }
        return "other";
    }

    /**
     * 获取文件归类
     *
     * @param filename 文件名称
     * @return 文件归类，如image、video、document、voice、other
     */
    public static int getFileTypeNum(String filename) {
        String fileType = getFileType(filename);
        if (IMAGES_TYPE.contains(fileType)) {
            return FileEnum.IMAGE.getTypeNum();
        }
        if (VOICE_TYPE.contains(fileType)) {
            return FileEnum.VOICE.getTypeNum();
        }
        if (VIDEO_TYPE.contains(fileType)) {
            return FileEnum.VIDEO.getTypeNum();
        }
        if (DOCUMENT_TYPE.contains(fileType)) {
            return FileEnum.DOCUMENT.getTypeNum();
        }
        return FileEnum.OTHER.getTypeNum();
    }

    /**
     * 获取新的文件名
     *
     * @param filename 原文件名
     * @return 新文件名
     */
    public static String getNewFilename(String filename) {
        return UUIDUtil.getUUID() + getFileType(filename);
    }

    /**
     * 获取文件名
     *
     * @param file 文件
     * @return 新文件名
     */
    public static String getFilename(MultipartFile file) {
        String filename = file.getOriginalFilename();
        if(StringUtils.isBlank(filename) || !filename.contains(".")) {
            return "";
        }
        return filename;
    }

    /**
     * 保证目录存在
     *
     * @param dir 需要使用的目录
     */
    public static void ensurePath(File dir) {
        if (dir != null && !dir.exists()) {
            boolean mkdirs = dir.mkdirs();
            if (!mkdirs) {
                logger.error("创建目录失败:{}", dir.getAbsoluteFile());
            }
        }
    }

    /**
     * 获取指定目录下的所有文件
     *
     * @param filePath 目录路径
     * @param fileList 文件列表
     */
    public static void getAllFile(String filePath, List<File> fileList) {
        File file = new File(filePath);
        if (file.isFile()) {
            fileList.add(file);
        }
        if (file.isDirectory()) {
            File[] childFileArray = file.listFiles();
            if (childFileArray == null || childFileArray.length == 0) {
                return;
            }
            for (File childFile : childFileArray) {
                getAllFile(childFile.getAbsolutePath(), fileList);
            }
        }
    }
}
